/****************************************Copyright (c)**************************************************
**                               深圳巨晶科技公司
**
**--------------File Info-------------------------------------------------------------------------------
* 文   件 : I2C驱动头文件
* 作   者 : 作者名
* 版   本 ：
* 完成时间 : 2023年7月1日
* 描   述 ：***I2C驱动使用方法:***
* 1.1.将头文件I2C_driver.h中的配置项拷贝到系统配置文件SysConfig.h中(如果有)或Includes.h中靠前位置,并根据使用I2C个数来配置.
* 1.2.申请一个指向I2C驱动对象的指针: sI2C_DRIVER * Obj;
* 1.3.调用方法 I2C_Init 注册I2C驱动对象并初始化
**------------------------------------------------------------------------------------------------------
* 修 改 人 ：
* 版	本 ：
* 修改时间 : 年月日
* 修改内容 : 
*********************************************************************************************************
*/
#ifndef __I2C_DRIVER_H__
#define __I2C_DRIVER_H__

/****************************** Includes *****************************/
#include "Includes.h"

#pragma region //==========I2C配置项===========
#ifndef	USE_I2C_NUM
#define	USE_I2C_NUM			2	//根据使用I2C个数来修改0--n,0:不使用！！！
#endif
#pragma endregion

#pragma region //============类型类定义============
//I2C驱动类型定义
typedef struct {
	I2C_HandleTypeDef		*phi2c;			/*指向I2C句柄*/
	osSemaphoreId			DoneSemId;		/*I2C通讯完成信号量句柄或ID号*/
} sI2C_DRIVER;
#pragma endregion


#pragma region //============方法============
/*
********************************************************************************
** 描    述 :	注册I2C驱动变量并初始化
** 返    回 :	0:成功；1--重复初始化已经注册过了；-1--i2c_drive变量已经用完，需调整USE_I2C_NUM数据。
********************************************************************************/
int I2C_Init(sI2C_DRIVER	**pI2cDriver/*[out]指向指向I2C驱动结构的指针*/,
	I2C_HandleTypeDef	*phi2c/*[IN]指向I2C句柄*/,
	osSemaphoreId		DoneSemId/*[IN]I2C通讯完成信号量句柄或ID号*/);

/*
********************************************************************************
** 描    述 :	通过I2C向外设器件写1个数据或命令
** 操作: S+device_addr+SA+command+SA+P
** 返    回 :	0:成功，-1--访问I2C故障，其它--设备无应答或其它总线错误
********************************************************************************/
int I2C_WriteCommand(sI2C_DRIVER *pI2cDriver/*指向I2C驱动句柄*/,
	unsigned char device_addr/*外设或终端地址*/,
	unsigned char command/*写入外设器件的命令*/);

/*
********************************************************************************
** 描    述 :	通过I2C从外设器件读入len个数据
** 返    回 :	0:成功，-1--访问I2C故障，其它--设备无应答或其它总线错误
********************************************************************************/
int I2C_ReadData(sI2C_DRIVER *pI2cDriver/*指向I2C驱动句柄*/,
	unsigned char device_addr/*器件地址*/,
	unsigned char *pData/*指向读入的数据存放处*/,
	unsigned short len/*读入外设器件寄存器连续地址下的字节数*/);

/*
********************************************************************************
** 描    述 :	通过I2C向外设器件寄存器写数据
** 有的器件不支持使用DMA模式读写寄存器数据，DMA模式会写入寄存器地址紧接着发停止位。
** 解决办法1@不使用DMA模式2@不要定义USE_DMA_WrADDRandSTOP即可，但效率稍差(写寄存器地址期间比其低级的任务得不到响应)。
** 返    回 :	0:成功，-1--访问I2C故障，其它--设备无应答或其它总线错误
********************************************************************************/
int I2C_WriteRegister(sI2C_DRIVER *pI2cDriver/*指向I2C驱动句柄*/,
	unsigned char device_addr/*外设或终端地址*/,
	unsigned char reg_addr/*外设器件的寄存器地址*/,
	unsigned char *pData/*指向欲写入的数据*/,
	unsigned short len/*写入外设器件寄存器连续地址下的字节数*/);

/*
********************************************************************************
** 描    述 :	通过I2C从外设器件寄存器读数据
** 有的器件不支持使用DMA模式读写寄存器数据，DMA模式会写入寄存器地址紧接着发停止位。
** 解决办法1@不使用DMA模式2@不要定义USE_DMA_WrADDRandSTOP即可，但效率稍差(写寄存器地址期间比其低级的任务得不到响应)。
** 返    回 :	0:成功，-1--访问I2C故障，其它--设备无应答或其它总线错误
********************************************************************************/
int I2C_ReadRegister(sI2C_DRIVER *pI2cDriver/*指向I2C驱动句柄*/,
	unsigned char device_addr/*外设或终端地址*/,
	unsigned char reg_addr/*外设器件的寄存器地址*/,
	unsigned char *pData/*指向读入的数据存放处*/,
	unsigned short len/*读入外设器件寄存器连续地址下的字节数*/);
				  
#pragma endregion
 
#endif // __I2C_DRIVER_H__


